support live login relation

FFIB 5 年之前
父节点
当前提交
20bff3496c
共有 2 个文件被更改,包括 75 次插入0 次删除
  1. 61 0
      api/mini_views.py
  2. 14 0
      live/models.py

+ 61 - 0
api/mini_views.py

@@ -10,6 +10,7 @@ from pywe_miniapp import get_session_info, get_session_key, get_userinfo, store_
10 10
 from pywe_storage import RedisStorage
11 11
 
12 12
 from account.models import UserInfo
13
+from live.models import RoomInfo, RoomUserInfo
13 14
 from utils.redis.connect import r
14 15
 
15 16
 
@@ -63,6 +64,66 @@ def mini_login_api(request):
63 64
 
64 65
     return response(data=user.data)
65 66
 
67
+@logit(res=True)
68
+@transaction.atomic
69
+def mini_live_login_api(request):
70
+    share_openid = request.POST.get('code', '')
71
+    room_id = request.POST.get('room_id', '')
72
+
73
+    wxcfg = WECHAT.get('MINIAPP', {})
74
+
75
+    appid = wxcfg.get('appID')
76
+    secret = wxcfg.get('appsecret')
77
+
78
+    code = request.POST.get('code', '')
79
+
80
+    # // 正常返回的JSON数据包
81
+    # {
82
+    #     "openid": "OPENID",
83
+    #     "session_key": "SESSIONKEY",
84
+    # }
85
+    #
86
+    # // 满足UnionID返回条件时,返回的JSON数据包
87
+    # {
88
+    #     "openid": "OPENID",
89
+    #     "session_key": "SESSIONKEY",
90
+    #     "unionid": "UNIONID"
91
+    # }
92
+    # // 错误时返回JSON数据包(示例为Code无效)
93
+    # {
94
+    #     "errcode": 40029,
95
+    #     "errmsg": "invalid code"
96
+    # }
97
+    session_info = get_session_info(appid=appid, secret=secret, code=code)
98
+    logger.debug(session_info)
99
+    session_key = session_info.get('session_key', '')
100
+    unionid = session_info.get('unionid', '')
101
+    openid = session_info.get('openid', '')
102
+
103
+    # Get or Create User
104
+    user, _ = UserInfo.objects.select_for_update().get_or_create(openid=openid)
105
+
106
+    # Set User Key's Value
107
+    if unionid:
108
+        user.unionid = unionid
109
+    user.save()
110
+
111
+    # Store SessionKey
112
+    store_session_key(appid=appid, secret=secret, session_key=session_key, unid=user.user_id, storage=RedisStorage(r))
113
+
114
+
115
+    # Update live
116
+    room = RoomInfo.objects.get(room_id=room_id)
117
+    RoomUserInfo.create(
118
+        room_id=room_id,
119
+        share_openid=share_openid,
120
+        user_id=user.user_id,
121
+        openid=user.openid,
122
+        anchor_id=room.anchor_id,
123
+    )
124
+
125
+    return response(data=user.data)
126
+
66 127
 
67 128
 @logit
68 129
 @transaction.atomic

+ 14 - 0
live/models.py

@@ -158,6 +158,20 @@ class RoomGoodsInfo(BaseModelMixin):
158 158
     def __unicode__(self):
159 159
         return self.pk
160 160
 
161
+class RoomUserInfo(BaseModelMixin):
162
+    room_id = models.CharField(_('room_id'), max_length=32, help_text='房间唯一标识', db_index=True)
163
+    anchor_id = models.CharField(_('anchor_id'), max_length=32, blank=True, help_text='主播唯一标识')
164
+    user_id = models.CharField(_('anchor_id'), max_length=32, blank=True, help_text='用户唯一标识')
165
+    openid = models.CharField(_('openid'), max_length=32, blank=True, help_text='用户 openid')
166
+    share_openid = models.CharField(_('share_openid'), max_length=32, blank=True, help_text='分享用户 openid')
167
+
168
+    class Meta:
169
+        verbose_name = _('直播间用户信息')
170
+        verbose_name_plural = _('直播间用户信息')
171
+
172
+    def __unicode__(self):
173
+        return self.pk
174
+
161 175
 class RoomOrderInfo(BaseModelMixin):
162 176
     """
163 177
     # Trade State of Wechat Query